'use strict';

const Controller = require('egg').Controller;

class UserController extends Controller {
    /**
     * 登录
     */
    async login() {
        const { ctx } = this;
        const { mobile, code } = ctx.request.body;
        // 手机号不能为空
        if (!mobile) {
            ctx.body = {
                code: 400,
                message: '请输入手机号',
            };
            return;
        }
        // 手机号是否合法
        if (!/^1[3-9][\d]{9}$/.test(mobile)) {
            ctx.body = {
                code: 400,
                message: '手机号格式不正确',
            };
            return;
        }
        // 检查数据库是否存在该手机号对应的验证码
        const codeFromDB = await this.service.code.find(mobile);
        if (!codeFromDB) {
            ctx.body = {
                code: 404,
                message: '该验证码不存在',
            };
            return;
        }
        // 检查验证码是否正确
        if (codeFromDB.code !== code) {
            ctx.body = {
                code: 400,
                message: '验证码不正确',
            };
            return;
        }
        // 该验证码已经完成了验证，应该清除掉
        await this.service.code.remove(mobile);

        // 验证码正确，查看用户表是否存在该手机号用户
        let user = await this.service.user.findByMobile(mobile);

        // 如果用户不存在
        if (!user) {
            // 默认注册
            await this.service.user.create(mobile);
            // 再查询一次，为了和上一步数据结构保持一致
            user = await this.service.user.findByMobile(mobile);
        }

        // 生成 token
        const token = ctx.helper.genToken({ ...user });

        // 返回响应
        ctx.body = {
            code: 200,
            data: {
                token,
                user,
            },
            message: '登录成功',
        };
    }

    /**
     * 获取验证码
     */
    async getCode() {
        const { ctx } = this;
        // 获取查询参数
        const { mobile } = ctx.query;
        if (!mobile) {
            ctx.body = {
                code: 400,
                message: '请输入手机号',
            };
            return;
        }
        // 手机号是否合法
        if (!/^1[3-9][\d]{9}$/.test(mobile)) {
            ctx.body = {
                code: 400,
                message: '手机号格式不正确',
            };
            return;
        }
        // 检查是否已存在该手机号对应的验证码
        const codeFromDb = await this.service.code.find(mobile);
        // 存在这个验证码
        if (codeFromDb) {
            // 验证码已经过了 60s
            if (Number(codeFromDb.create_time) + 60000 > Date.now()) {
                ctx.body = {
                    code: 403,
                    data: {
                        create_time: codeFromDb.create_time,
                    },
                    message: '不能频繁获取验证码',
                };
                return;
            }
            // 验证码存在数据库中，但是已经过期了
            await this.service.code.remove(mobile);
        }

        // 发送验证码
        // 生成随机验证码
        const code = String(Math.random()).substr(2, 6);

        // 一般都是调用第三方接口，给用户发送验证码
        // ... 给用户发送验证码

        // 把验证码保存到数据库里面，方便下面调用登录接口时，进行校验
        const res = await this.service.code.create(mobile, code);
        if (res.affectedRows === 1) {
            ctx.body = {
                code: 200,
                message: '验证码发送成功',
            };
        }
    }
}

module.exports = UserController;
